{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "e2f9094b",
   "metadata": {},
   "source": [
    "# CIS Demo"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "aa5228ac",
   "metadata": {},
   "source": [
    "## Dependencies and Imports"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "8e8b8e5e",
   "metadata": {},
   "outputs": [],
   "source": [
    "#@title Install dependencies\n",
    "\n",
    "!pip install -q silero \n",
    "\n",
    "import torch\n",
    "from IPython.display import Audio, display"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "acae2b32",
   "metadata": {},
   "source": [
    "## Load model"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9c9ea864",
   "metadata": {},
   "source": [
    "Available models:\n",
    "- v5_cis_base\n",
    "- v5_cis_base_nostress\n",
    "- v5_cis_ext"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5bdccf02",
   "metadata": {},
   "source": [
    "**Important notes:**\n",
    "- `v5_cis_base` and `v5_cis_ext` models assume that proper stress should be added for each word for all languages, i.e. к+ошка;\n",
    "- `v5_cis_base_nostress` models assume that proper stress should be added for each word ONLY for slavic languages (i.e. ru, bel, ukr);\n",
    "- It is recommended to select a speaker that matches the target language. For example, to generate text in Kazakh, select `kaz_zhadyra`. To generate Russian text with the same voice, select `ru_zhadyra`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "0b88376e",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-11-21T16:06:21.078823Z",
     "start_time": "2025-11-21T16:06:18.566283Z"
    }
   },
   "outputs": [],
   "source": [
    "from silero import silero_tts\n",
    "\n",
    "model_id = 'v5_cis_base_nostress'\n",
    "\n",
    "device = torch.device('cpu')\n",
    "\n",
    "model, example_text = silero_tts(language='ru',\n",
    "                                 speaker=model_id)\n",
    "model.to(device)  # gpu or cpu"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "7f5af06a",
   "metadata": {},
   "outputs": [],
   "source": [
    "val_texts = {\n",
    "    'aze': 'Mən hər səhər erkən qalxıb təzə hava ilə məşq edirəm.',\n",
    "    'bak': 'Күп балалыларға былайҙа сертификат бирелә бит.',\n",
    "    'bel': 'В+ечарам +я любл+ю чыт+аць цік+авыя кн+ігі пры святл+е начнік+а.',\n",
    "    'chv': 'Эпĕ ача чухнех пиччĕшсемпе юнашар кĕтӳльех вăйă вылянă.',\n",
    "    'erz': 'Монь веленек шачемсёномань панжовксонть кис эрьва кизонь туема.',\n",
    "    'hye': 'Ես շաբաթ օրերին սիրում եմ երկար զբոսնել անտառով:',\n",
    "    'kat': 'მე ძალიან მიყვარს ჩემი ოჯახის წევრებთან ერთად დროის გატარება.', \n",
    "    'kaz': 'Мен балалық шақта жаңа досдармен танысуды әбден ұнататынмын.',\n",
    "    'kbd': 'Сэ уиӀуанэ уашъхъэри унагъуэхэри сэбэп хъущтыр сыту щӀэлъэӀу.',\n",
    "    'kir': 'Мен мектепте окуп жүргөндө эң жакшы досум менен тааныштым.',\n",
    "    'kjh': 'Мин аал чоньчарға пастабахсынар хайдиғырам хынаңның хоный.',\n",
    "    'mdf': 'Монь тяштеть эзда кизонь карьхть сельметь кштинь аф лац.',\n",
    "    'sah': 'Мин бүгүн оройунан саһарҕа оонньуу сылдьан сымнаҕыстык утуйбутум.',\n",
    "    'tat': 'Мин ерак түгел урман эчендә чиста һавада йөргәне яратам.',\n",
    "    'tgk': 'Ман дар бораи хонаи нави худ дар канори дарё хондем.',\n",
    "    'udm': 'Мон ашалэ тӥлед нуналлы огы быдэсэ кошко учке.',\n",
    "    'ukr': '+Я з р+аннього дит+инства д+уже любл+ю сл+ухати цік+аві к+азки.',\n",
    "    'uzb': \"Men bolaligimda ko'pincha do'stlarim bilan hovlida futbol o'ynardim.\",\n",
    "    'xal': 'Би эцкд сарин җилин дуулҗана хойр седклтә күрәм.'\n",
    "}"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9312cd49",
   "metadata": {},
   "source": [
    "### List speakers"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "946bd349",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-11-21T15:46:18.088605Z",
     "start_time": "2025-11-21T15:46:17.718929Z"
    }
   },
   "outputs": [],
   "source": [
    "sorted(model.speakers)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "47536ec8",
   "metadata": {},
   "source": [
    "## Example"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "44edd4dd",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-11-21T16:09:51.442259Z",
     "start_time": "2025-11-21T16:09:51.439666Z"
    }
   },
   "source": [
    "### Slavic(ru/bel/ukr)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "70cf453e",
   "metadata": {},
   "source": [
    "To automatically place stress marks, you can use the `silero-stress` library. An example is given below"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "6329a216",
   "metadata": {},
   "outputs": [],
   "source": [
    "# v5_cis_base_nostress\n",
    "sample_rate = 48000\n",
    "speaker = 'ukr_igor'\n",
    "\n",
    "example_text = '+Я з р+аннього дит+инства д+уже любл+ю сл+ухати цік+аві к+азки.'\n",
    "\n",
    "audio = model.apply_tts(text=example_text,\n",
    "                        speaker=speaker,\n",
    "                        sample_rate=sample_rate)\n",
    "print(example_text)\n",
    "display(Audio(audio, rate=sample_rate))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "0d4abfc2",
   "metadata": {},
   "outputs": [],
   "source": [
    "# v5_cis_base_nostress\n",
    "sample_rate = 48000\n",
    "speaker = 'ru_zhadyra'\n",
    "\n",
    "example_text = 'брод+ить с дожд+ём п+од +окнами тво+ими.'\n",
    "\n",
    "audio = model.apply_tts(text=example_text,\n",
    "                        speaker=speaker,\n",
    "                        sample_rate=sample_rate)\n",
    "print(example_text)\n",
    "display(Audio(audio, rate=sample_rate))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8dbb30c0",
   "metadata": {},
   "source": [
    "### Not slavic"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "9eb3d582",
   "metadata": {},
   "outputs": [],
   "source": [
    "# v5_cis_base_nostress\n",
    "sample_rate = 48000\n",
    "speaker = 'kaz_zhadyra'\n",
    "\n",
    "example_text = 'Мен балалық шақта жаңа досдармен танысуды әбден ұнататынмын.'\n",
    "\n",
    "audio = model.apply_tts(text=example_text,\n",
    "                        speaker=speaker,\n",
    "                        sample_rate=sample_rate)\n",
    "print(example_text)\n",
    "display(Audio(audio, rate=sample_rate))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "2c5ef9f1",
   "metadata": {},
   "outputs": [],
   "source": [
    "sample_rate = 48000\n",
    "speaker = 'hye_zara'\n",
    "\n",
    "example_text = 'Ես շաբաթ օրերին սիրում եմ երկար զբոսնել անտառով:'\n",
    "\n",
    "audio = model.apply_tts(text=example_text,\n",
    "                        speaker=speaker,\n",
    "                        sample_rate=sample_rate)\n",
    "print(example_text)\n",
    "display(Audio(audio, rate=sample_rate))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "374a7a2b",
   "metadata": {},
   "source": [
    "# Accentor Demo\n",
    "\n",
    "In case, you need word stress, but you don't want to manually annotate texts, we provide supplementary accentuation modules as a part of `silero-stress` project.\n",
    "\n",
    "- We provide full-fledged accentor and `ё`-ficator trained on large vocab with homograph disambiguation for Russian language.\n",
    "\n",
    "- We provide accentor trained on large vocab for Ukrainian language.\n",
    "\n",
    "- And we provide manually annotated dictionaries with minimalistic wrapper for another languages."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a1c91567",
   "metadata": {},
   "outputs": [],
   "source": [
    "!pip install -q silero-stress"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a9cc7f9d",
   "metadata": {},
   "source": [
    "### Russian / Ukrainian"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "1bafa1de",
   "metadata": {},
   "outputs": [],
   "source": [
    "from silero_stress import load_accentor"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "56d281a9",
   "metadata": {},
   "outputs": [],
   "source": [
    "accentor = load_accentor(lang='ru')  # lang could be \"ru\" / \"ukr\"\n",
    "sample_sent = \"В недрах тундры выдры в гетрах тырят в ведра ядра кедров.\"\n",
    "print(accentor(sample_sent))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0ad92954",
   "metadata": {},
   "source": [
    "### Other Languages\n",
    "\n",
    "Basically, there is no \"accentor\" for other languages, but we released stress dictionaries with some minimalistic wrapper."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "de008519",
   "metadata": {},
   "outputs": [],
   "source": [
    "sample_texts = {\n",
    "    # if you need \"aze\" language, you need to specify which layout do you use - latin or cyrillic\n",
    "    'aze_lat': 'Mən hər səhər erkən qalxıb təzə hava ilə məşq edirəm.',\n",
    "    'aze_cyr': 'Мән һәр сәһәр еркән галхыб тәзә һава ылә мәшг едырәм.',\n",
    "    'bak': 'Күп балалыларға былайҙа сертификат бирелә бит.',\n",
    "    'bel': 'Вечарам я люблю чытаць цікавыя кнігі пры святле начніка.',\n",
    "    'chv': 'Эпĕ ача чухнех пиччĕшсемпе юнашар кĕтӳльех вăйă вылянă.',\n",
    "    'erz': 'Монь веленек шачемсёномань панжовксонть кис эрьва кизонь туема.',\n",
    "    'hye': 'Ես շաբաթ օրերին սիրում եմ երկար զբոսնել անտառով:',\n",
    "    'kat': 'მე ძალიან მიყვარს ჩემი ოჯახის წევრებთან ერთად დროის გატარება.',\n",
    "    'kaz': 'Мен балалық шақта жаңа досдармен танысуды әбден ұнататынмын.',\n",
    "    'kbd': 'Сэ уиӀуанэ уашъхъэри унагъуэхэри сэбэп хъущтыр сыту щӀэлъэӀу.',\n",
    "    'kir': 'Мен мектепте окуп жүргөндө эң жакшы досум менен тааныштым.',\n",
    "    'kjh': 'Мин аал чоньчарға пастабахсынар хайдиғырам хынаңның хоный.',\n",
    "    'mdf': 'Монь тяштеть эзда кизонь карьхть сельметь кштинь аф лац.',\n",
    "    'sah': 'Мин бүгүн оройунан саһарҕа оонньуу сылдьан сымнаҕыстык утуйбутум.',\n",
    "    'tat': 'Мин ерак түгел урман эчендә чиста һавада йөргәне яратам.',\n",
    "    'tgk': 'Ман дар бораи хонаи нави худ дар канори дарё хондем.',\n",
    "    'udm': 'Мон ашалэ тӥлед нуналлы огы быдэсэ кошко учке.',\n",
    "    # if you need \"uzb\" language, you need to specify which layout do you use - latin or cyrillic\n",
    "    'uzb_lat': \"Men bolaligimda ko'pincha do'stlarim bilan hovlida futbol o'ynardim.\",\n",
    "    'uzb_cyr': \"Мен болалигимда кўпинча дўстларим билан ҳовлида футбол ўйнардим.\",\n",
    "    'xal': 'Би эцкд сарин җилин дуулҗана хойр седклтә күрәм.'\n",
    "}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "dfe1f669",
   "metadata": {},
   "outputs": [],
   "source": [
    "from silero_stress.simple_accentor import SimpleAccentor"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "428d5295",
   "metadata": {},
   "outputs": [],
   "source": [
    "for lang in sample_texts:\n",
    "    accentor = SimpleAccentor(lang=lang)\n",
    "    print(sample_texts[lang])\n",
    "    print(accentor(sample_texts[lang]))\n",
    "    print()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "4fb4b98c",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.9"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
